package com.lhs.service.impl;

import cn.dev33.satoken.stp.StpUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.lhs.mapper.User_PointMapper;
import com.lhs.Result.Result;
import com.lhs.service.User_PointService;
import com.lhs.entity.user.User_point;
import com.lhs.entity.user.User_point_log;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class User_PointServiceimpl extends ServiceImpl<User_PointMapper, User_point> implements User_PointService {


    @Autowired
    private User_PointMapper User_PointMapper;

    @Override
    public Result<User_point> getUserPoint() {
        if (!StpUtil.isLogin()) {
            return Result.error("请先登录");
        } else {
            Long userId = StpUtil.getLoginIdAsLong();
            return getUserPointByUserId(userId);
        }
    }


    /**
     * 添加或者减少用户积分
     * @param userId 用户ID
     * @param point 积分值，正数表示增加，负数表示减少
     * @return 用户积分信息
     */
 @Override
public Result<User_point> addOrSubtractPoint(Long userId, Integer point) {
    // 参数校验
    if (userId == null) {
        return Result.error("用户ID不能为空");
    }
    if (point == null) {
        return Result.error("积分值不能为空");
    }

    try {
        // 1. 查询用户当前积分
        User_point userPoint = User_PointMapper.selectByUserId(userId);
        // 空值检查
        if (userPoint == null) {
            return Result.error("未找到用户积分信息");
        }

        // 2. 计算新的积分值
        int newPoint = userPoint.getCurrentPoint() + point;
        // 边界检查：防止积分变为负数
        if (newPoint < 0) {
            return Result.error("积分不足，无法扣除");
        }

        if (point > 0) {
            final int EXP_MULTIPLIER = 2;
            int newExp = userPoint.getExp() + EXP_MULTIPLIER * point;
            userPoint.setExp(newExp);
        }
        // 3. 更新数据库（此处应包含实际的数据库更新操作）
        userPoint.setCurrentPoint(newPoint);
        // 4. 返回结果
        return Result.success(userPoint);
    } catch (Exception e) {
        // 异常处理
        return Result.error("积分操作失败：" + e.getMessage());
    }
}


/**
 * 获取用户积分记录
 * @return 用户积分记录
 */
    @Override
    public Result<User_point_log> getUserPointRecord() {
     if (!StpUtil.isLogin()){
         return Result.error("请先登录");
     }else {
         Long userId = StpUtil.getLoginIdAsLong();
         User_point_log user_point_log = User_PointMapper.selectLogByUserId(userId);
         if (user_point_log == null){
             return Result.error("用户积分信息不存在");
         }else {
             return Result.success(user_point_log);
         }
     }
    }

    @Override
    public Result<User_point> getUserPoint_Admin(Long userId) {
        return getUserPointByUserId(userId);
    }








    // 私有方法



    /**
     * 根据用户ID获取用户积分信息
     * @param userId 用户ID
     * @return 用户积分信息
     */
    private Result<User_point> getUserPointByUserId(Long userId) {
        User_point user_point = User_PointMapper.selectByUserId(userId);
        if (user_point == null) {
            return Result.error("用户名错误或者用户积分信息不存在");
        } else {
            return Result.success(user_point);
        }
    }




}
